﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Course1
{
    /*
     * 1.类建议写在命名空间之下（用于限定）
     * 2.一个.cs文件可以有多个public class
     * 2.类的内部可以定义类，内內部的类叫内部类（此时外部类仅仅起到限定作用）一般私有化，只在内内部使用
     */
    internal class Example5
    {
        /// <summary>
        /// Example3的内部类，此时Example3只起到限定作用
        /// 不建议使用public修饰内部类，如果需要公开没必须写在Example3的内部
        /// </summary>
        class InnerClass
        {
            public int x;
            public void DoSome()
            {
                //函数内部可以定义一个函数，叫内部函数，
                //内部函数只在内部使用讨论访问性没有意义
                bool even(int num)
                {
                    if (this.x<0)//内部函数也能使用this，即拥有实列函数的能力（可以理解成是DoSome函数把this传给了even函数）
                    {
                        return false;
                    }
                    return num % 2 == 0;
                }
                var isEven = even(20);
            }
        }

        public void DoSome()
        {
            //Example3相对于InnerClass的关系类似namespace（Course1）和的关系，只起到限定作用
            var ff1 = new InnerClass();
            //完整写法，在Example3内部可以省略限定名
            var ff2 = new Example5.InnerClass();
        }
    }
    /// <summary>
    /// 静态类
    ///     如果一个类不需要实列成员，只需要静态成员可以定义成static class，意义不大，只是阻止你定义实列成员
    /// 工具类
    ///     必须是静态类
    ///     一般一Util,Utiliies,Helper结尾
    /// 扩展类型
    ///     一般已Extensions结尾
    /// </summary>
    internal static class Example5Util
    {
        public static double Pi = 3.14;

        public static bool IsNullOrEmpty1(string str)
        {
            if (str == null || str == "")
            {
                return true;
            }
            return false;
        }
     
    }
    /// <summary>
    /// 原型扩展
    /// </summary>
    internal static class StringExtensions
    {
        /// <summary>
        /// 原型扩展：外部给string类型扩展出来一个实列方法。
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static bool IsNullOrEmpty2(this string str)
        {
            if (str == null || str == "")
            {
                return true;
            }
            return false;
        }
    }
    
}
